package br.com.esporte.facade.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.esporte.business.AdvertenciaService;
import br.com.esporte.business.AtualizacaoService;
import br.com.esporte.business.DiaPraticadoGrupoService;
import br.com.esporte.business.GrupoParticipanteService;
import br.com.esporte.business.GrupoService;
import br.com.esporte.business.JogadorService;
import br.com.esporte.business.MailService;
import br.com.esporte.business.MovimentacaoService;
import br.com.esporte.business.PartidaService;
import br.com.esporte.business.PresencaDiaPraticadoService;
import br.com.esporte.business.RegraService;
import br.com.esporte.business.TimeService;
import br.com.esporte.business.UsuarioService;
import br.com.esporte.business.VotacaoService;
import br.com.esporte.business.impl.util.DataGeneric;
import br.com.esporte.facade.Fachada;
import br.com.esporte.model.Advertencia;
import br.com.esporte.model.DiaPraticadoGrupo;
import br.com.esporte.model.Grupo;
import br.com.esporte.model.GrupoParticipante;
import br.com.esporte.model.Jogador;
import br.com.esporte.model.Movimentacao;
import br.com.esporte.model.Partida;
import br.com.esporte.model.PresencaDiaPraticado;
import br.com.esporte.model.Regra;
import br.com.esporte.model.Time;
import br.com.esporte.model.TipoAdvertenciaEnum;
import br.com.esporte.model.TipoEsporteEnum;
import br.com.esporte.model.TipoVotacaoEnum;
import br.com.esporte.model.Usuario;
import br.com.esporte.model.Votacao;
import br.com.esporte.model.atualizacao.Atualizacao;
import br.com.esporte.persistence.filter.FiltroAdvertencia;
import br.com.esporte.persistence.filter.FiltroAtualizacao;
import br.com.esporte.persistence.filter.FiltroDiaPraticadoGrupo;
import br.com.esporte.persistence.filter.FiltroGrupo;
import br.com.esporte.persistence.filter.FiltroGrupoParticipante;
import br.com.esporte.persistence.filter.FiltroJogador;
import br.com.esporte.persistence.filter.FiltroMovimentacao;
import br.com.esporte.persistence.filter.FiltroPartida;
import br.com.esporte.persistence.filter.FiltroPresencaDiaPraticado;
import br.com.esporte.persistence.filter.FiltroRegra;
import br.com.esporte.persistence.filter.FiltroTime;
import br.com.esporte.persistence.filter.FiltroUsuario;
import br.com.esporte.persistence.filter.FiltroVotacao;

/**
 * @author Milton Domingues
 */
@Service("fachada")
public class FachadaImpl implements Fachada {

	@Autowired
	private TimeService timeService;

	@Autowired
	private MovimentacaoService movimentacaoService;

	@Autowired
	private AtualizacaoService controladorAtualizacaoService;

	@Autowired
	private VotacaoService controladorVotacaoService;

	@Autowired
	private PresencaDiaPraticadoService controladorPresencaDiaPraticado;

	@Autowired
	private PartidaService controladorPartida;

	@Autowired
	private DiaPraticadoGrupoService controladorDiaPraticadoGrupo;

	@Autowired
	private UsuarioService controladorUsuario;

	@Autowired
	private AdvertenciaService controladorAdvertencia;

	@Autowired
	private MailService controladorMail;

	@Autowired
	private GrupoService controladorGrupo;

	@Autowired
	private RegraService controladorRegra;

	@Autowired
	private GrupoParticipanteService controladorGrupoPartGrupo;

	@Autowired
	private GrupoParticipanteService controladorgrParticipanteGrupo;

	@Autowired
	private JogadorService controladorJogador;

	private FachadaImpl() {

	}

	@Override
	public void alterar(Atualizacao vo, Usuario usuario) {
		controladorAtualizacaoService.editar(vo, usuario);
	}

	@Override
	public void alterar(DiaPraticadoGrupo dia, Usuario usuario) {
		controladorDiaPraticadoGrupo.editar(dia, usuario);
	}

	@Override
	public void alterar(Grupo grupo, Usuario usuario) {
		controladorGrupo.editar(grupo, usuario);
	}

	@Override
	public void alterar(GrupoParticipante grupo, Usuario usuario) {
		controladorGrupoPartGrupo.editar(grupo, usuario);
	}

	@Override
	public void alterar(Movimentacao movimentacao, Usuario usuario) {
		movimentacaoService.editar(movimentacao, usuario);
	}

	@Override
	public void alterar(Partida partida, Usuario usuario) {
		controladorPartida.editar(partida, usuario);
	}

	@Override
	public void alterar(PresencaDiaPraticado presenca, Usuario usuario) {
		controladorPresencaDiaPraticado.editar(presenca, usuario);
	}

	@Override
	public void alterar(Regra regra, Usuario usuario) {
		controladorRegra.editar(regra, usuario);
	}

	@Override
	public void alterar(Votacao votacao, Usuario usuario) {
		controladorVotacaoService.editar(votacao, usuario);
	}

	public void alterarUsuario(Usuario usuario) {
		controladorUsuario.editar(usuario, usuario);
	}

	@Override
	public Atualizacao buscarAtualizacao(Long id) {
		return controladorAtualizacaoService.buscar(id);
	}

	@Override
	public DiaPraticadoGrupo buscarDiaPraticadoGrupo(Long id) {
		return controladorDiaPraticadoGrupo.buscar(id);
	}

	@Override
	public GrupoParticipante buscarGrupoParticipanteGrupo(Long id) {
		return controladorGrupoPartGrupo.buscar(id);
	}

	@Override
	public Movimentacao buscarMovimentacao(Long id) {
		return movimentacaoService.buscar(id);
	}

	@Override
	public Partida buscarPartida(Long id) {
		return controladorPartida.buscar(id);
	}

	@Override
	public PresencaDiaPraticado buscarPresencaDiaPraticado(Long id) {
		return controladorPresencaDiaPraticado.buscar(id);
	}

	@Override
	public Usuario buscarUsuario(Long id) {
		return controladorUsuario.buscar(id);
	}

	@Override
	public Votacao buscarVotacao(Long id) {
		return controladorVotacaoService.buscar(id);
	}

	@Override
	public List<Advertencia> consultar(FiltroAdvertencia filtro) {
		return (List<Advertencia>) controladorAdvertencia.consultar(filtro);
	}

	@Override
	public List<Atualizacao> consultar(FiltroAtualizacao filtro) {
		return (List<Atualizacao>) controladorAtualizacaoService.consultar(filtro);
	}

	@Override
	public List<DiaPraticadoGrupo> consultar(FiltroDiaPraticadoGrupo filtro) {
		return (List<DiaPraticadoGrupo>) controladorDiaPraticadoGrupo.consultar(filtro);
	}

	@Override
	public List<Grupo> consultar(FiltroGrupo filtro) {
		return (List<Grupo>) controladorGrupo.consultar(filtro);
	}

	@Override
	public List<GrupoParticipante> consultar(FiltroGrupoParticipante filtro) {
		return (List<GrupoParticipante>) controladorGrupoPartGrupo.consultar(filtro);
	}

	@Override
	public List<Jogador> consultar(FiltroJogador filtro) {
		return (List<Jogador>) controladorJogador.consultar(filtro);
	}

	@Override
	public List<Movimentacao> consultar(FiltroMovimentacao filtro) {
		return (List<Movimentacao>) movimentacaoService.consultar(filtro);
	}

	@Override
	public List<Partida> consultar(FiltroPartida filtro) {
		return (List<Partida>) controladorPartida.consultar(filtro);
	}

	@Override
	public List<PresencaDiaPraticado> consultar(FiltroPresencaDiaPraticado filtro) {
		return (List<PresencaDiaPraticado>) controladorPresencaDiaPraticado.consultar(filtro);
	}

	@Override
	public List<Regra> consultar(FiltroRegra filtroRegra) {
		return (List<Regra>) controladorRegra.consultar(filtroRegra);
	}

	@Override
	public List<Time> consultar(FiltroTime filtro) {
		return (List<Time>) timeService.consultar(filtro);
	}

	@Override
	public List<Usuario> consultar(FiltroUsuario filtroUsuario) {
		return (List<Usuario>) controladorUsuario.consultar(filtroUsuario);
	}

	@Override
	public List<Votacao> consultar(FiltroVotacao filtro) {
		return (List<Votacao>) controladorVotacaoService.consultar(filtro);
	}

	@Override
	public List<Usuario> consultar(Grupo grupo){
		return controladorUsuario.consultarUsuarioGrupo(grupo);
	}

	@Override
	public List<Atualizacao> consultarAtualizacaoGruposUsuario(Usuario usuario, TipoEsporteEnum tipo, int qtd, int offset) {
		return controladorAtualizacaoService.consultarAtualizacaoGruposUsuario(usuario, tipo, qtd, offset);
	}

	@Override
	public List<DiaPraticadoGrupo> consultarDiaPraticadoGrupo(Grupo grupo) {
		return controladorDiaPraticadoGrupo.consultarDiaPraticadoGrupo(grupo);
	}

	@Override
	public List<GrupoParticipante> consultarGruposTipoEsporteParticipaUsuario(Usuario usuario, TipoEsporteEnum tipo) {
		return controladorgrParticipanteGrupo.consultarGruposTipoEsporteParticipaUsuario(usuario, tipo);
	}

	@Override
	public Usuario consultarMaiorPontuador(DiaPraticadoGrupo dia) {
		return controladorDiaPraticadoGrupo.consultarMaiorPontuador(dia);
	}

	@Override
	public List<DataGeneric<Usuario, DataGeneric<Integer, Boolean>>> consultarMaiorVotadoQtdVotos(DiaPraticadoGrupo dia, TipoVotacaoEnum tipo) {
		return controladorVotacaoService.consultarMaiorVotadoQtdVotos(dia, tipo);
	}

	@Override
	public DataGeneric<Usuario, Integer> consultarMaiorVotadoTipoDiaPraticado(DiaPraticadoGrupo dia, TipoVotacaoEnum tipo) {
		return controladorVotacaoService.consultarMaiorVotadoTipoDiaPraticado(dia, tipo);
	}

	@Override
	public List<Usuario> consultarModeradores(Grupo grupo) {
		return controladorGrupo.consultarModeradores(grupo);
	}

	@Override
	public DiaPraticadoGrupo consultarProximaDiaPraticadoGrupo(Grupo grupo) {
		return controladorDiaPraticadoGrupo.consultarProximaDiaPraticadoGrupo(grupo);
	}

	@Override
	public Integer consultarQtdAdvertencias(DiaPraticadoGrupo dia, TipoAdvertenciaEnum tipo) {
		return controladorDiaPraticadoGrupo.consultarQtdAdvertencias(dia, tipo);
	}

	@Override
	public Integer consultarQtdPartidas(DiaPraticadoGrupo dia){
		return controladorDiaPraticadoGrupo.consultarQtdPartidas(dia);
	}

	@Override
	public Integer consultarQtdPontos(DiaPraticadoGrupo dia) {
		return controladorDiaPraticadoGrupo.consultarQtdPontos(dia);
	}

	@Override
	public List<Usuario> consultarUsuariosParticipaGrupo(Grupo grupo) {
		return controladorgrParticipanteGrupo.consultarUsuariosParticipaGrupo(grupo);
	}

	@Override
	public void enviarEmail(String texto, Usuario usuario) {
		controladorMail.sendMailText(texto, usuario);
	}

	@Override
	public void excluir(GrupoParticipante grupoParticipante) {
		controladorGrupoPartGrupo.excluir(grupoParticipante);
	}

	@Override
	public void excluir(Usuario usuario) {
		controladorUsuario.excluir(usuario);
	}

	@Override
	public void inserir(Atualizacao vo, Usuario usuario) {
		controladorAtualizacaoService.inserir(vo, usuario);
	}

	@Override
	public void inserir(DiaPraticadoGrupo diaPraticadoGrupo, Usuario usuario) {
		controladorDiaPraticadoGrupo.inserir(diaPraticadoGrupo, usuario);
	}

	@Override
	public void inserir(Grupo grupo, Usuario usuario) {
		controladorGrupo.inserir(grupo, usuario);
	}

	@Override
	public void inserir(Movimentacao movimentacao, Usuario usuario) {
		movimentacaoService.inserir(movimentacao, usuario);
	}

	@Override
	public void inserir(Partida partida, Usuario usuario) {
		controladorPartida.inserir(partida, usuario);
	}

	@Override
	public void inserir(PresencaDiaPraticado presenca, Usuario usuario) {
		controladorPresencaDiaPraticado.inserir(presenca, usuario);
	}

	@Override
	public void inserir(Regra regra, Usuario usuario) {
		controladorRegra.inserir(regra, usuario);
	}

	@Override
	public void inserir(Usuario usuario) {
		controladorUsuario.inserir(usuario, usuario);
	}

	@Override
	public void inserir(Votacao votacao, Usuario usuario) {
		controladorVotacaoService.inserir(votacao, usuario);
	}

	@Override
	public void solicitarIngressoGrupo(Grupo grupo, Usuario usuario) {
		controladorgrParticipanteGrupo.solicitarIngressoGrupo(grupo, usuario);
	}

	@Override
	public void validarLogin(Usuario usuario) {
		controladorUsuario.validarLogin(usuario);
	}

}
